package com.kamawang;

import java.util.ArrayList;
import java.util.Scanner;

/**
 * 图形的面积
 * 时间限制：1.000S  空间限制：128MB
 * 题目描述
 * 考虑一个简单的图形类层次结构，包括基类 Shape 和两个派生类 Rectangle 和 Circle。每个类都有一个用于计算面积的方法。你的任务是编写一个程序，根据输入数据创建一个图形对象，然后计算并输出其面积。
 * 输入描述
 * 输入包括多行，每行包含一个图形的描述。 描述的第一个单词是图形类型（"rectangle"或"circle"），然后是与该图形相关的参数。 对于矩形，参数是宽度和高度，对于圆形，参数是半径。输入以单词"end"结束。
 * 输出描述
 * 对于每个图形描述，输出其类型和面积。使用两位小数点精度输出面积。
 * 输入示例
 * rectangle 5 3
 * circle 2
 * end
 * 输出示例
 * Rectangle area: 15.00
 * Circle area: 12.56
 * 提示信息
 * 长方形面积的计算 = 长 * 宽
 *
 * 圆形面积的计算 = 3.14 * 半径 * 半径
 */

// 抽象类
abstract class Shape{
    protected String type;
    // 封装 具体实现交给子类重写
    public abstract double CalculateArea();

    public String getType() {
        return type;
    }
}

// 继承
class Rectangle extends Shape{

    private int width;
    private int height;
    // 构造方法
    public Rectangle(int width, int height) {
        this.type = "Rectangle";
        this.width = width;
        this.height = height;
    }
    // 方法重写
    @Override
    public double CalculateArea() {
        return width * height;
    }
}
class Circle extends Shape{
    private int radius;

    public Circle(int radius) {
        this.type = "Circle";
        this.radius = radius;
    }

    @Override
    public double CalculateArea() {
        return 3.14 * radius * radius;
    }
}
public class Main21 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        ArrayList<Shape> arr = new ArrayList<>();
        while (true){
            String inputLine = scanner.nextLine();
            String[] data = inputLine.split(" ");
            String shapeType = data[0];
            if (shapeType.equals("end")){
                break;
            }
            if (shapeType.equals("Rectangle")){
                int width = Integer.parseInt(data[1]); // 字符串变为整型 "2"-> 2
                int height = Integer.parseInt(data[2]);
                arr.add(new Rectangle(width, height));
            }else if (shapeType.equals("Circle")){
                int radius = Integer.parseInt(data[1]);
                arr.add(new Circle(radius));
            }
        }
        for (Shape shape: arr) {
            // 多态  父类 指向 子类 使用的是子类的方法
            System.out.printf("%s area: %.2f%n", shape.getType(), shape.CalculateArea());
        }
    }

}


/**
 * // 创建 Shape 类型的引用，指向 Circle 对象
 * Shape myCircle = new Circle(5);
 *
 * // 创建 Shape 类型的引用，指向 Rectangle 对象
 * Shape myRectangle = new Rectangle(4, 6);
 *
 * 多态性是指：虽然方法名称相同，但实际调用的方法是根据对象的类型动态确定的
 * // 创建 Shape 类型，指向 Circle 对象
 * Shape myCircle = new Circle(5);
 * // 虽然是Shape类型，但是调用方法时根据对象本身的类型来处理
 * double circleArea = myCircle.calculateArea();
 * System.out.println("圆形的面积：" + circleArea);
 */